自学笔记十四:Matlab浮点型:创建和转换、取值范围、运算和精度问题 您所在的位置:网站首页 float转为double 编码的变化 自学笔记十四:Matlab浮点型:创建和转换、取值范围、运算和精度问题

自学笔记十四:Matlab浮点型:创建和转换、取值范围、运算和精度问题

2023-11-12 12:31| 来源: 网络整理| 查看: 265

1.浮点型的概念

浮点型分为单精度(single)浮点型和双精度(double)浮点型;

IEEE浮点数算术标准(IEEE 754)是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号,等同于国际标准ISO/IEC/IEEE 60559。该标准由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会(Microprocessor Standards Committee, MSC)发布,是最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。

这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷与非数值(NaN)),以及这些数值的“浮点数运算子”,它也指明了四种数值修约规则和五种例外状况(包括例外发生的时机与处理方式)。

2.计算机存储和表达

任何存储为double格式的值都需要64位,格式如下:

用法

63

符号(0=正数,1=负数)

62 至 52

指数

51 至 0

小数位(分数位)

任何存储为single格式的值都需要32位,格式如下:

用法

31

符号(0=正数,1=负数)

30 至 23

指数

22 至 0

小数位(分数位)

3.创建方法

创建双精度浮点数使用double函数,创建单精度浮点数使用单精度single函数;

程序示例:

double(1)  %创建双精度浮点型1

a=1  %默认双精度浮点型,再赋值给a

single(1)  %单精度1

4.浮点型的取值范围

测试浮点型数据的取值范围最大值和最小值分别使用realmax和realmin函数;

程序示例:

realmax('double')  %双精度最大取值范围

[-realmax,-realmin,realmin,realmax]  %完整的双精度取值范围(-0和0之间取不到任何值)

[-realmax('single'),-realmin('single'),realmin('single'),realmax('single')]

%单精度浮点型取值范围,上式未指定则默认取双精度浮点型范围

5.判断数据类型

判断是否为浮点型使用isfloat函数,测试一个变量的数据类型使用class函数;

程序示例:

a=1

isfloat(a)  %判断是否浮点型

class(a)  %测试变量a的数据类型

6.浮点型与整型的转换方法

c=int8(1)  %整型1

c1=double(c)  %整型转化为双精度,数据类型创建方法也是转化方法

c2=single(c)  %转化为单精度

int8(c1)  %双精度转化为整型

whos c c1 c2  %查看数据类型:双精度8字节精度最高

7.精度问题的引出

先看一组程序示例:

(4/3-1)*3-1  %结果不是0

sin(pi)    %结果不是0

说明,大家可以在Matlab运行上面两行代码看一下结果,是不是有点意外;

8.浮点型的精度问题

在Matlab中,几乎所有的运算,默认都是以符合IEEE 754标准的双精度算法执行的,由于计算机只能以有限的精度表示数字(双精度要求52个尾数位),对于数值运算,这种浮点型表示值与其真实值存在微小的差异;

所以,如果浮点算术运算的结果不如预期的那样精确,甚至有时会产生数学上非直觉的结果,则很可能是由于计算机硬件的限制造成的,硬件可能没有足够的位来表示结果的完全准确性,因此仅截取了结果值的部分精度;

但这并不是matlab中的错误,运用IEEE 754标准所执行的所有计算都受到影响,其中包括用C或FORTRAN等;

9.精度问题相关函数eps

eps函数默认求数值1的精度,求得的结果是计算机表达1这个数值时,由于硬件限制产生的误差值,因为计算机有限位数只能存储有限精度;

程序示例(建议打开Matlab练习体会)

1

eps

1+eps  %返回结果1,即eps视为和1之间没有再存储其他数值,返回1

eps(10)  %10附近的精度

eps(100)  %100附近的精度

eps(single(100))  %单精度100附近的精度

10.精度问题的处理方法:符号运算

程序示例:

(4/3-1)*3-1  %4/3并非完整精确的分数,而是有限存储空间内的近似值,因此结果并非0

(sym(4/3)-1)*3-1  %返回0,引入符号型获得精确4/3值

sin(pi)  %圆周率pi会保留部分精度的小数再进行计算,因此结果有误差

sin(sym(pi))  %sym将pi转化为符号型再求sin值,结果是0

11.相关文章

Matlab自学笔记十三 数据类型:整型,创建方法、取值范围、整型运算、常用函数、程序示例icon-default.png?t=M85Bhttps://blog.csdn.net/freexyn/article/details/128362178Matlab自学笔记九:算术运算、数组运算、矩阵运算、运算符、常用函数、程序示例icon-default.png?t=M85Bhttps://blog.csdn.net/freexyn/article/details/127948563

12.相关视频

1.23/Matlab浮点型数据类型/计算sin(pi)≠0/你知道原因吗

End



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有